package main

import "fmt"

func main() {
	/*
				Go语言的数据类型：
				1.基本数据类型：
					（1）布尔类型：bool
						取值：true, false
					  注：
						1.布尔类型变量的默认值为 false
						2.Go语言中，不允许将整型强制转换为布尔类型
						3.布尔类型无法参与数值类型，也无法与其他类型进行转换

					（2）数值类型：
						1.整数：int
							有符号：最高位表示符号，0 为正数，1 为负数，其余位表示数值
								int8:(-128 到 127)
								int16:(-32768 到 32767)
								int32:(-2147483648 到 2147483647)
								int64:(-9223372036854775808 到 9223372036854775807)
							无符号：所有位表示数值
								uint8:(0 到 255)
								uint16:(0 到 65535)
								uint32:(0 到 4294967295)
								uint64:(0 到 18446744073709551615)

							int, uint // 跟随电脑系统的位数，与上面带数字的int~,uint~ 语法上不是一种类型
		                    uintptr: 无符号整型，用于存放一个指针

							byte: uint8
							rune: int32
						2.浮点：生活中的小数
							float32, float64 // 单精度，双精度
						3.复数：complex
					（3）字符串：string
						Go语言里的字符串的内部实现使用 UTF-8 编码。

				2.复合数据类型
					array, slice, map, function, struct, interface, channel...

		        注：在涉及到二进制传输、读写文件的结构描述时，为了保持文件的结构不会受到不同编译目标平台字节长度的影响，不要使用 int 和 uint。
	*/
	//1. 布尔类型
	var b1 bool // 默认值为 false
	b1 = true
	fmt.Println(b1) // 定义变量必须得使用

	b2 := false
	fmt.Println(b2)

	//2. 整型
	var i1 int8
	i1 = 100
	fmt.Println(i1)
	var i2 uint8
	i2 = 200
	fmt.Println(i2)

	var i3 int //默认与电脑系统的位数一致
	i3 = 1000
	fmt.Println(i3)
	//语法角度：int, int64 不认为是同一种类型
	//var i4 int64
	//i4 = i3 //cannot use i3 (variable of type int) as type int64 in assignment

	var i5 uint8
	i5 = 100
	var i6 byte
	fmt.Println(i5, i6)

	// 在声明整型变量时，如果没有指明变量类型默认为 int
	var i7 = 100
	fmt.Printf("%T,%d\n", i7, i7) // int,100

	//3.浮点
	var f1 float32
	f1 = 3.14
	var f2 float64
	f2 = 4.67
	// %f 默认保存小数点后六位，%.?f 表示保存小数点后 ? 位
	fmt.Printf("%T,%f\n", f1, f1) //float32,3.140000
	fmt.Printf("%T,%f\n", f2, f2) //float64,4.670000

	//直接打印，是几位，就是几位
	fmt.Println(f1) // 3.14
	fmt.Println(f2) // 4.67

	//在声明浮点型变量时，如果没有指明变量类型默认是 float64
	var f3 = 2.55
	fmt.Printf("%T,%f\n", f3, f3) // float64,2.550000

	//4.复数
	var v = complex(2.1, 3)             //构造一个复数
	a := real(v)                        //返回复数实部
	b := imag(v)                        //返回复数虚部
	fmt.Println("实部：", a, ",", "虚部", b) //实部： 2.1 , 虚部 3

}
